package models

import (
	"database/sql/driver"
	"fmt"
	"time"
)

// CustomTime 自定义时间类型
type CustomTime struct {
	time.Time
}

// Scan 实现 sql.Scanner 接口
func (ct *CustomTime) Scan(value interface{}) error {
	if value == nil {
		*ct = CustomTime{Time: time.Time{}} // 零值处理
		return nil
	}

	switch v := value.(type) {
	case []byte:
		t, err := ParseTime(string(v))
		if err != nil {
			return err
		}
		*ct = CustomTime{Time: t}
		return nil
	case string:
		t, err := ParseTime(v)
		if err != nil {
			return err
		}
		*ct = CustomTime{Time: t}
		return nil
	default:
		return fmt.Errorf("unsupported type: %T", value)
	}
}

// ParseTime 尝试多种时间格式解析
func ParseTime(value string) (time.Time, error) {
	formats := []string{
		"2006-01-02 15:04:05",         // 标准格式
		"2006-01-02 15:04:05.999999",  // 带微秒
		"2006-01-02T15:04:05Z",        // ISO 8601 格式
		"2006-01-02T15:04:05.999999Z", // ISO 8601 带微秒
	}

	for _, format := range formats {
		t, err := time.Parse(format, value)
		if err == nil {
			return t, nil
		}
	}

	return time.Time{}, fmt.Errorf("无法解析时间: %s", value)
}

// Value 实现 driver.Valuer 接口
func (ct CustomTime) Value() (driver.Value, error) {
	if ct.IsZero() {
		return nil, nil // 返回 NULL 处理零值
	}
	return ct.Time.Format("2006-01-02 15:04:05"), nil
}

// IsZero 判断是否为零值
func (ct CustomTime) IsZero() bool {
	return ct.Time.IsZero()
}
